package fr.generali.accueilclient.gwt.client.state.event;

import com.google.gwt.event.shared.EventHandler;
import com.google.gwt.event.shared.GwtEvent;

import fr.generali.accueilclient.gwt.client.state.event.SaveStateEvent.SaveStateHandler;

/**
 * Evénement levé lorsque un état est sauvegardé.
 * 
 * @param <S> The type permettant d'enregistrer l'état.
 * @param <F> The type de l'objet pour lequel l'état est enregistré.
 * 
 * @author M. Abdennebi 5 juin 2012 *
 */
public class SaveStateEvent<S, T> extends GwtEvent<SaveStateHandler<S, T>> {

    public interface SaveStateHandler<S, T> extends EventHandler {

        void onSaveState(SaveStateEvent<S, T> event);
    }

    private static Type<SaveStateHandler< ? , ? >> TYPE;

    public static Type<SaveStateHandler< ? , ? >> getType() {
        return TYPE != null ? TYPE : (TYPE = new Type<SaveStateHandler< ? , ? >>());
    }

    private final S state;

    private final T target;

    private final String stateId;

    /**
     * @param target L'objet cible pour lequel l'état est enregistré.
     * @param state L'objet "état" représentant l'état de l'objet "target".
     * @param stateId l'identifiant de l'état enregistré.
     */
    public SaveStateEvent(T target, S state, String stateId) {
        this.state = state;
        this.target = target;
        this.stateId = stateId;
    }

    @SuppressWarnings({"unchecked", "rawtypes" })
    @Override
    public Type<SaveStateHandler<S, T>> getAssociatedType() {
        return (Type ) TYPE;
    }

    public S getState() {
        return state;
    }

    @Override
    protected void dispatch(SaveStateHandler<S, T> handler) {
        handler.onSaveState(this);
    }

    public String getStateId() {
        return stateId;
    }

    public T getTarget() {
        return target;
    }

}
